/*
 * SHTC3驱动函数库
 * BETA1.0 为Arduino适配I2C协议的SHTC3驱动
 * 目前无CRC-8校验
 * 2022-01-11 FIRFIT AKARIN
*/

#ifndef SHTC3_BETA0_1_HPP
#define SHTC3_BETA0_1_HPP

#include <Arduino.h>
#include <Wire.h>

#define DEV_ADDRESS 0X70

#define DEV_WAKEUPCMD_HSB 0X35
#define DEV_WAKEUPCMD_LSB 0X17

#define DEV_SLEEPCMD_HSB 0XB0
#define DEV_SLEEPCMD_LSB 0X98

/*↑唤醒及睡眠指令*/

#define DEV_CSE_READTEMP_FIRST_HSB 0X7C//当时钟延展功能开启时，若想要让温度数据先读取，使用该条指令
#define DEV_CSE_READTEMP_FIRST_LSB 0XA2

#define DEV_CSE_READRH_FIRST_HSB 0X5C//当时钟延展功能开启时，若想要湿度数据先读取，使用该条指令
#define DEV_CSE_READRH_FIRST_LSB 0X24

#define DEV_CSDE_READRH_FIRST_HSB 0X78//当时钟延展功能关闭时，若想要湿度数据先读取，使用该条指令
#define DEV_CSDE_READRH_FIRST_LSB 0X66

#define DEV_CSDE_READRH_FIRST_HSB 0X58//当时钟延展功能关闭时，若想要湿度数据先读取，使用该条指令
#define DEV_CSDE_READRH_FIRST_LSB 0XE0

typedef struct TEMPDATA{
  byte HUMIHSB;
  byte HUMILSB;
  byte HUMICRC;
  byte TEMPHSB;
  byte TEMPLSB;
  byte TEMPCRC;
};

typedef struct FinalDATA{
  double HUMI;
  double TEMP;
  bool CRCSTATUS;
  };

void WakeupDEFICE()//唤醒设备
{
  Wire.begin();
  Wire.beginTransmission(DEV_ADDRESS);
  Wire.write(DEV_WAKEUPCMD_HSB);
  Wire.write(DEV_WAKEUPCMD_LSB);
  Wire.endTransmission();
  delay(25);
}

TEMPDATA ReadDATACMD()
{
  TEMPDATA READ;
  byte TEMPLA[6];//暂存数据
  Wire.begin();
  Wire.beginTransmission(DEV_ADDRESS);
  Wire.write(DEV_CSE_READRH_FIRST_HSB);
  Wire.write(DEV_CSE_READRH_FIRST_LSB);
  Wire.endTransmission();
  delay(25);

  Wire.requestFrom(DEV_ADDRESS,6);
  for(int i=0;i<6;i++)
  TEMPLA[i]=Wire.read();
  
  READ.HUMIHSB=TEMPLA[0];
  READ.HUMILSB=TEMPLA[1];
  READ.HUMICRC=TEMPLA[2];
  READ.TEMPHSB=TEMPLA[3];
  READ.TEMPLSB=TEMPLA[4];
  READ.TEMPCRC=TEMPLA[5];

  Wire.endTransmission();
  return READ;
}

FinalDATA GetFinalDATA(TEMPDATA FROM)
{
  FinalDATA LASTRESULT;//存放最终计算结果
  int COMBINETEMP;//将两个BYTE类型的数据整合进一个16位的int中
  int COMBINEHUMI;

  COMBINETEMP|=(FROM.TEMPHSB<<8);
  COMBINETEMP|=FROM.TEMPLSB;

  COMBINEHUMI|=(FROM.HUMIHSB<<8);
  COMBINEHUMI|=FROM.HUMILSB;

  LASTRESULT.HUMI=((double)COMBINEHUMI/65536.0)*100.0;
  LASTRESULT.TEMP=(((double)COMBINETEMP/65536.0)*175.0)-45.0;
  return LASTRESULT;
}

#endif
